#pragma once
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdarg>
#include <string>
#include <ctime>
#include <sys/types.h>
#include <unistd.h>
using namespace std;

const string filename = "log/tcpserver.log";

enum{
    DEBUG=0,
    INFO,
    WARNING,
    ERROR,
    FATAL,
    UNKNOW
};



static string toLevelString(int level){
    switch(level){
        case DEBUG:
            return "DEBUG";
        case INFO:
            return "INFO";
        case WARNING:
            return "WARNING";
        case ERROR:
            return "ERROR";
        case FATAL:
            return "FATAL";
        default:
            return "UNKNOW";
    }
}

static string getTime(){
    // int tm_sec;         /* seconds */
    // int tm_min;         /* minutes */
    // int tm_hour;        /* hours */
    // int tm_mday;        /* day of the month */
    // int tm_mon;         /* month */
    // int tm_year;        /* year */
    // int tm_wday;        /* day of the week */
    // int tm_yday;        /* day in the year */
    // int tm_isdst;       /* daylight saving time */

    time_t curr = time(nullptr);
    struct tm *tmp = localtime(&curr);

    char buf[128];
    snprintf(buf, sizeof(buf), "%d-%d-%d %d:%d:%d", tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
                                                                        tmp->tm_hour, tmp->tm_min, tmp->tm_sec);

    return buf;
}

//用户输入：
//  DEBUG xxxx:12,fuck
//  logMessage(DEBUG, "xxxx: %d, %s", 12 ,s.c_str())
//日志格式：
//  日志等级 时间 打印日志的进程pid 消息体


//              等级        可变参数进行格式化输入输出
void logMessage(int level, const char *format, ...){

    //日志的左半部分：日志等级 时间 打印日志的进程pid
    char logLeft[1024];

    //将level转成string
    string level_string = toLevelString(level);
    //将时间戳转换成yy-mm-dd hh:mm:ss
    string curr_time = getTime();

    //把level、time、pid写到logLeft中
    snprintf(logLeft, sizeof(logLeft), "%s %s %d ", level_string.c_str(), curr_time.c_str(), getpid());

    //右半部分：消息体
    char logRight[1024];
    va_list p;
    //p指向format的起始位置
    va_start(p, format);
    //把format中的数据写到logRight中
    vsnprintf(logRight, sizeof(logRight), format, p);
    va_end(p);

    //打印日志内容
    printf("%s %s\n", logLeft, logRight);

    //保存到文件中
    FILE *fp = fopen(filename.c_str(), "a+");
    if(fp == nullptr){
        return;
    }
    fprintf(fp, "%s %s\n", logLeft, logRight);
    fflush(fp);

    fclose(fp);
}